// source --> https://packerfancave.net/wp-content/plugins/woozone-contextual/assets/frontend.js?ver=1.0
/*
Author : AA-Team - http://themeforest.net/user/AA-Team
*/
// Initialization and events code for the app
WZC_frontend = (function ($) {
"use strict";
var ajaxurl = WZC_ajaxurl,
maincontainer = null,
WZC_opt = {},
max_replacements = 0, // (global) max replacements - for all keywords
max_kwc = {}, // max replaments - per keyword
kwc = {}; // keyword replacements number counter
// init function, autoload
(function init() {
// load the triggers
$(document).ready(function(){
maincontainer = $(".WZC-the-content");
if( typeof(maincontainer) != 'undefined' && maincontainer.length > 0 ) {
WZC_opt = maincontainer.first().find('.WZC-options').html();
WZC_opt = JSON && JSON.parse(WZC_opt) || $.parseJSON(WZC_opt);
WZC_opt = $.extend(WZC_opt, {});
maincontainer.find('.WZC-options').remove();
//console.log( WZC_opt ); return false;
//localStorage.setItem('WZC_opt', JSON.stringify( WZC_opt ));
//JSON.parse( localStorage.getItem('WZC_opt') );
triggers();
}
});
})();
function WZC_find_replace(searchText, replacement, searchNode)
{
// max allowed replacements
//if ( max_replacements && kwc > max_replacements ) return;
if (!searchText || typeof replacement === 'undefined') {
// Throw error here if you want...
return;
}
var word_boundary = '\\b', //'[\\s\\.\\(\\)\\[\\],]'
_regex = new RegExp(searchText, 'gmi');
if ( WZC_opt.find_distinct_words == 'yes' ) {
_regex = new RegExp('(?:^|' + word_boundary + ')(' + searchText + ')(?=$|' + word_boundary + ')', 'gmi')
}
var regex = typeof searchText === 'string' ? _regex : searchText,
childNodes = (searchNode || document.body).childNodes,
cnLength = childNodes.length,
contor = cnLength,
excludes = 'style,title,link,meta,script,object,iframe,img';
var currentNode = null;
while ( contor-- ) {
// max allowed replacements
//if ( max_replacements && kwc >= max_replacements ) return;
currentNode = childNodes[contor];
if ( typeof currentNode === 'undefined' ) continue;
var _rule = (
currentNode.nodeType === 1
&& (excludes + ',').indexOf(currentNode.nodeName.toLowerCase() + ',') === -1
&& ( currentNode.nodeName.toLowerCase() != 'div'
|| ( currentNode.nodeName.toLowerCase() == 'div' && !misc.hasClass(currentNode, 'WZC-tooltip') )
)
);
if ( _rule ) {
WZC_find_replace(searchText, replacement, currentNode); // arguments.callee
}
if (currentNode.nodeType !== 3 || !regex.test(currentNode.data) ) {
continue;
}
var parent = currentNode.parentNode,
frag = (function(){
var html = currentNode.data.replace(regex, replacement),
wrap = document.createElement('div'),
frag = document.createDocumentFragment();
wrap.innerHTML = html;
while (wrap.firstChild) {
frag.appendChild(wrap.firstChild);
}
//kwc[searchText]++;
return frag;
})();
parent.insertBefore(frag, currentNode);
parent.removeChild(currentNode);
}
}
function WZC_max_replacements()
{
var kwc = {}; // keyword replacements number counter
$('.WZC-tooltip').each(function() {
var that = $(this),
keyword = that.data('keyword');
if ( !misc.hasOwnProperty(kwc, keyword) ) {
kwc[keyword] = 0;
}
kwc[keyword]++;
// max allowed replacements
var mr = max_replacements;
if ( misc.hasOwnProperty(max_kwc, keyword) ) {
mr = parseInt( max_kwc[keyword] );
}
if ( mr && kwc[keyword] > mr ) {
// mark as to be removed tooltip
that.addClass('WZC-keyword-remove');
}
});
//console.log( kwc );
// rollback to original keywords text
misc.removeTagKeepContent( 'WZC-tooltip WZC-keyword-remove', 'class' );
//mrdebug();
return kwc;
}
function WZC_save_hits( keywords ) {
//keywords = JSON.stringify( keywords );
var data = {
action : 'WZC_save_hits',
keywords : keywords
};
// turn the result into a query string
//data = $.param( data );
$.ajax({
url: ajaxurl,
dataType: "json",
method: 'post',
data: data,
// Handle the successful result
success: function( response ) {
}
});
}
function mrdebug() {
// debug!
var kwc = {}; // keyword replacements number counter
$('.WZC-tooltip').each(function() {
var that = $(this),
keyword = that.data('keyword');
if ( !misc.hasOwnProperty(kwc, keyword) ) {
kwc[keyword] = 0;
}
kwc[keyword]++;
});
console.log( kwc );
}
function create_tooltip( that )
{
// get country
var country = null;
if ( misc.hasOwnProperty(WZC_opt, 'country') ) {
country = JSON.parse(WZC_opt.country) || $.parseJSON(WZC_opt.country);
}
var $html = new Array(),
$rows = that.data('items'),
link_target = WZC_opt.link_target,
tooltip_max_height = WZC_opt.tooltip_max_height;
var __lt = link_target != '' && link_target != 'no' ? ' target="' + link_target + '"' : ' ';
$html.push( '
' );
return $html.join("\n");
}
function moreBtnList(tbl) {
var toolbar = tbl;
function build_position( moreBtn ) {
var winW = $(window).width(), winH = $(window).height(),
mcH = maincontainer.height(),
mcLeft = maincontainer.scrollLeft(), mcTop = maincontainer.scrollTop(),
winLeft = $(window).scrollLeft(), winTop = $(window).scrollTop(),
tbW = toolbar.outerWidth(), tbH = toolbar.outerHeight(),
moreBtnW = moreBtn.outerWidth(true),
moreBtnOffset = moreBtn.offset(),
moreBtnPos = moreBtn.position(),
moreBtnWinTop = parseInt( moreBtnPos.top - mcTop ),
moreBtnWinBottom = parseInt( mcH - moreBtnPos.top - mcTop ),
moreBtnWinLeft = parseInt( moreBtnPos.left - mcLeft ),
mTb = moreBtn.find('.WZC-tooltip-container'), mTbW = mTb.outerWidth(), mTbH = mTb.outerHeight(),
mTbMargin = { top: WZC_opt.tooltip_margin_top, left: WZC_opt.tooltip_margin_left };
var css = {
'position' : 'absolute',
'top' : '',
'left' : '',
'bottom' : '',
'right' : '',
'height' : '',
'overflow-y' : ''
};
mTbMargin.top = parseInt( mTbMargin.top );
mTbMargin.left = parseInt( mTbMargin.left );
// fix vertical
var spaceFreeTop = parseInt( moreBtnWinTop - mTbMargin.top ),
spaceFreeBottom = parseInt( moreBtnWinBottom - mTbMargin.top );
if ( spaceFreeTop < mTbH ) {
css.top = 0 + mTbMargin.top;
} else if ( spaceFreeBottom < mTbH ) {
css.bottom = 0 + mTbMargin.top;
} else {
css.top = 0 + mTbMargin.top; //parseInt( moreBtnPos.top );
}
// fix horizontal
var spaceFreeLeft = parseInt( moreBtnWinLeft - mTbMargin.left );
if ( spaceFreeLeft < mTbW ) {
css.left = moreBtnW + mTbMargin.left;
} else {
css.right = moreBtnW + mTbMargin.left; //parseInt( moreBtnPos.left + moreBtnW );
}
// open more list
for (var i in css) {
if ( $.inArray(i, ['top', 'left', 'bottom', 'right', 'height']) != -1 && css[i] != '' ) {
css[i] = parseInt( css[i] ) + 'px';
}
}
var $moreList = mTb;
$moreList.css( css ).stop().css({'display': 'block'});
}
function triggers() {
// more button
toolbar.find('.WZC-tooltip')
.mouseenter(function(e) {
e.stopPropagation();
var $this = $(this), $moreList = $this.find('.WZC-tooltip-container');
build_position( $this );
})
.mouseleave(function(e) {
e.stopPropagation();
var $this = $(this), $moreList = $this.find('.WZC-tooltip-container');
// close more list with delay timer to obtain time to hover over more list
var moreTimeout = setTimeout(function () {
$moreList.stop(true, false).css({'display': 'none'});
}, 250);
$this.data('moreTimeout', moreTimeout);
});
// more list of buttons!
toolbar.find('.WZC-tooltip .WZC-tooltip-container')
.mouseenter(function(e) {
e.stopPropagation();
var $this = $(this)
parent = $this.parent();
// reset delay timer
if ( parent.data('moreTimeout') ) clearTimeout( parent.data('moreTimeout') );
})
.mouseleave(function(e) {
e.stopPropagation();
var $this = $(this);
// close more list
$this.stop().css({'display': 'none'});
});
}
triggers();
}
function triggers()
{
// build keyword & products tooltips for content
$(".WZC-the-content").each(function(){
var that = $(this),
that_doc = that.get(0),
keywords = null, //that.data('keywords')
link_color = WZC_opt.link_color;
keywords = that.find('.WZC-keywords').html();
keywords = JSON && JSON.parse(keywords) || $.parseJSON(keywords);
keywords = $.extend(keywords, {});
that.find('.WZC-keywords').remove();
//console.log( keywords ); return false;
max_replacements = parseInt( WZC_opt.link_maxreplace );
// debug - no replacements are made!
if (max_replacements === -999) return;
// loop through keywords
$.each( keywords, function(){
var $row = $(this),
products = $row,
keyword = '',
mr = '',
items = new Array;
//delete product[0]['keyword'];
$.each( $row.first().get(0), function(key, item){
keyword = item['keyword'];
mr = item['mr'];
items.push( item );
});
//console.log( keyword );
if ( !misc.hasOwnProperty(max_kwc, keyword) ) {
max_kwc[keyword] = parseInt( mr != '' ? mr : max_replacements );
}
//if ( !misc.hasOwnProperty(kwc, keyword) ) {
// kwc[keyword] = 0;
//}
//WZC_find_replace( '\b' + keyword + '\b', function(term){
WZC_find_replace( keyword, function(term){
var link = $( '' );
link.css( 'background-color', link_color );
//link.data( 'keyword', keyword );
link.data( 'items', items );
link.html( term + " " + create_tooltip( link ) );
return link[0].outerHTML;
}, that_doc );
});
//console.log( kwc );
// keep replacements based on maximum allowed
var kwc = WZC_max_replacements();
//console.log( kwc );
// save keyword hits
WZC_save_hits( kwc );
moreBtnList( that );
});
}
var misc = {
hasOwnProperty: function(obj, prop) {
var proto = obj.__proto__ || obj.constructor.prototype;
return (prop in obj) &&
(!(prop in proto) || proto[prop] !== obj[prop]);
},
hasClass: function(el, cls) {
return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1;
//return el.className && new RegExp("(\\s|^)" + cls + "(\\s|$)").test(el.className);
},
// type: class | id | tag
removeTagKeepContent: function(id, type, keep_first_only, use_native) {
var keep_first_only = keep_first_only || true,
use_native = use_native || true;
// native | vanilla js - faster
if ( use_native ) {
var el = null;
switch (type) {
case 'class':
el = document.getElementsByClassName(id);
break;
case 'tag':
el = document.getElementsByTagName(id);
break;
case 'id':
el = document.getElementById(id);
break;
}
while (el.length) {
var parent = el[ 0 ].parentNode;
var cc = 0;
while( el[ 0 ].firstChild && ( !keep_first_only || ( keep_first_only && !cc ) ) ) {
parent.insertBefore( el[ 0 ].firstChild, el[ 0 ] );
cc++;
}
parent.removeChild( el[ 0 ] );
}
return;
}
// jquery version - slower than the vanilla js
//$( id ).contents().unwrap();
// OR
$( id ).replaceWith(function() { return $(this).contents(); });
return;
}
};
// external usage
return {
}
})(jQuery);